#ifndef GDL_IMAGE_HPP
#define GDL_IMAGE_HPP

#include <string>
#include "Resource.hpp"

namespace gdl
{
	class ImageImpl;

	////////////////////////////////////////////////////////////
	/// The Image class provides image loading and image
	/// binding.
	////////////////////////////////////////////////////////////
	class	Image : private Resource<ImageImpl>
	{
	public:
		////////////////////////////////////////////////////////////
		/// Default constructor.
		////////////////////////////////////////////////////////////
		Image(void);

		////////////////////////////////////////////////////////////
		/// Default destructor.
		////////////////////////////////////////////////////////////
		~Image(void);

		////////////////////////////////////////////////////////////
		/// Load an image from a file.
		///
		/// \param[in] filename Filename of the image with extension.
		/// \return An instance of the resource.
		////////////////////////////////////////////////////////////
		static Image		load(std::string const & filename);

		////////////////////////////////////////////////////////////
		/// Bind the texture on the GPU.
		////////////////////////////////////////////////////////////
		void			bind(void);

		////////////////////////////////////////////////////////////
		/// Get the width of the image.
		///
		/// \return Width of the image.
		////////////////////////////////////////////////////////////
		unsigned int		getWidth(void) const;

		////////////////////////////////////////////////////////////
		/// Get the height of the image.
		///
		/// \return Height of the image.
		////////////////////////////////////////////////////////////
		unsigned int		getHeight(void) const;

		////////////////////////////////////////////////////////////
		/// Get a pointer to the pixel array of the image.
		///
		/// \return Pointer to the pixel array.
		////////////////////////////////////////////////////////////
		unsigned char const*	getPixelPtr(void) const;

		using Resource<ImageImpl>::isValid;

	private:
		////////////////////////////////////////////////////////////
		/// Explicit constructor.
		///
		/// \param impl Pointer on ImageImpl.
		////////////////////////////////////////////////////////////
		explicit Image(ImageImpl* impl);

		////////////////////////////////////////////////////////////
		/// Image implementation.
		////////////////////////////////////////////////////////////
		friend class ImageImpl;
	};
}

#endif /* GDL_IMAGE_HPP */
